#version 130

varying vec3 LightIntensity;

uniform vec3 LightPosition; // Light position in eye coords.
uniform vec3 Kd; // Diffuse reflectivity
uniform vec3 Ld; // Light source intensity

uniform mat4 ModelMatrix;
uniform mat4 ViewMatrix;
uniform mat3 NormalMatrix;
uniform mat4 ProjectionMatrix;

const int cant_puntos = 6;
const float M_PI = 3.14159265;

uniform float time;
uniform vec2 puntos_de_control[4 * cant_puntos];

float interpolar_curvas(in float x, in float y){
	int i,j, final;
	float zx1,zx2,zy1,zy2;
	float f;
	
	// ESTA TODO EN UN VECTOR PORQUE SINO NO ANDA
	
	vec2 puntos1[4 * cant_puntos];
	
	for (i = 0; i < 4 * cant_puntos; i++) {
		puntos1[i] = puntos_de_control[i];
	}	
	for (j = 0; j < cant_puntos - 1; j++) {
		final = cant_puntos - j;
		for (i = 0; i < final; i++) {
			puntos1[i][1] = (0.5 - x) * puntos1[i][1] + (x + 0.5) * puntos1[i + 1][1];
			puntos1[i + cant_puntos][1] = (0.5 - x) * puntos1[i + cant_puntos][1] + (x + 0.5) * puntos1[i + cant_puntos + 1][1];
			puntos1[i + 2 * cant_puntos][1] = (0.5 - y) * puntos1[i + 2 * cant_puntos][1] + (y + 0.5) * puntos1[i + 2 * cant_puntos + 1][1];
			puntos1[i + 3 * cant_puntos][1] = (0.5 - y) * puntos1[i + 3 * cant_puntos][1] + (y + 0.5) * puntos1[i + 3 * cant_puntos + 1][1];
		}
	}
	zx1 = puntos1[0][1];
	zx2 = puntos1[cant_puntos][1];
	zy1 = puntos1[2 * cant_puntos][1];
	zy2 = puntos1[3 * cant_puntos][1];
	
	//return (1.0 - time) * zx1 + time * zx2;
	return (1.0 - time) * zy1 * zx1 + time * zy2 * zx2;
	//return (puntos_de_control[0][1] * (1.0 - time) + puntos_de_control[1][1] * time);
	//return ((zx1) * (1.0 - time) + (zx2) * time);
	//return 0.0;
	//return puntos1[0][1];
}

float mostrar_puntos_de_control(in float x, in float y){
	int intervalo;
	float f;
	float z;
	
	// Funcionando
	//f = x + y;
	f = (x + 0.5) * float(4 * cant_puntos);
	intervalo = int(f);
	f = float(intervalo);
	/*if(x <= 0.0){
		z = puntos_x_2[0][1];
	} else if(x < 0.333333){
		z = puntos_x_2[1][1];
	} else if( x < 0.666666){
		z = puntos_x_2[2][1];
	} else {
		z = puntos_x_2[3][1];
	}*/
	z = puntos_de_control[intervalo][1];
	
	//z = z / puntos_de_control[3][1];
	return z;
	//return f;
}

void main()
{
	// Convert normal and position to eye coords
	vec3 tnorm = normalize( NormalMatrix * gl_Normal);
	vec4 eyeCoords = ViewMatrix * ModelMatrix * gl_Vertex;
	vec3 s = normalize(LightPosition - vec3(eyeCoords));
	
	// The diffuse shading equation
	LightIntensity =  Ld * Kd * max( dot( s, tnorm ), 0.0 );
	
	vec4 v = vec4(gl_Vertex);
	
	//v.z = sin(5.0*v.x+2.0*M_PI*time)*0.5;
	
	v.z = interpolar_curvas(v.x, v.y);
	
	//v.z = time;
	
	//v.z = mostrar_puntos_de_control(v.x, v.y);

	//gl_Position = gl_ModelViewProjectionMatrix * v;
			
	// Convert position to clip coordinates and pass along
	//gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * gl_Vertex;
	gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * v;
}